﻿#pragma once

#include "ASL.h"

// Project 经典教学案例 Tutorial
// Update 2025.05.17
// Reference ......

// 经典教学案例类
class Tutorial
{
public:
    // 3.1 线性代数运算案例
    static void Example31(void);

    // 3.2 数值积分求解案例
    static void Example32(void);

    // 3.3 多维线性插值计算案例
    static void Example33(void);

    // 3.4 线性系统分析案例
    static void Example34(void);

    // 3.5 坐标系算法案例
    static void Example35(void);

    // 3.6 地球几何算法案例
    static void Example36(void);

    // 5.7 经典控制器设计案例
    static void Example57(void);

    // 5.8 控制系统时域分析案例
    static void Example58(void);

    // 5.10 控制系统频域分析案例
    static void Example510(void);

    // 5.15 姿态控制回路设计案例
    static void Example515(void);

    // 7 无人飞行器仿真应用案例
    static void Example7(void);
};

// 虚构飞行器质量特性模型
class UAVMass
{
public:
    // 构造函数
    UAVMass();

    // 析构函数
    ~UAVMass();

    // 初始化函数
    void initialize(void);

    // 单步运行函数
    void step(void);

public:
    // 输入端口列表
    struct Input
    {
        // 燃油消耗量 kg
        double fuelUsed;
    };

    // 输出端口列表
    struct Output
    {
        // 飞行器质量 kg
        double mass;

        // 飞行器重心位置 m 结构系 [X, Y, Z]
        ASL::Vector CG;

        // 飞行器转动惯量 kg*m^2 机体系 [3x3]
        ASL::Matrix Inertia;
    };

    // 参数端口列表
    struct Parameter
    {
        // 基础质量 kg
        double mass;

        // 基础重心位置 m 结构系 [X, Y, Z]
        ASL::Vector CG;

        // 基础转动惯量 kg*m^2 机体系 [3x3]
        ASL::Matrix Inertia;
    };

public:
    // 输入端口对象
    UAVMass::Input input;

    // 输入端口对象
    UAVMass::Output output;

    // 参数端口对象
    UAVMass::Parameter parameter;

private:
};

// 虚构飞行器气动特性模型
class UAVAeroDynamic
{
public:
    // 构造函数
    UAVAeroDynamic();

    // 析构函数
    ~UAVAeroDynamic();

    // 初始化函数
    void initialize(void);

    // 单步运行函数
    void step(void);

public:
    // 输入端口列表
    struct Input
    {
        // 动压 Pa
        double dynamicPressure;

        // 飞行速度 m/s
        double velocity;

        // 马赫数 -
        double mach;

        // 攻角 deg
        double alpha;

        // 侧滑角 deg
        double beta;

        // 机体角速度 deg/s 机体系 [X, Y, Z]
        ASL::Vector omega;

        // 舵面偏转角 deg [副翼, 方向舵, 升降舵]
        ASL::Vector delta;

        // 飞行器重心位置 m 结构系 [X, Y, Z]
        ASL::Vector CG;
    };

    // 输出端口列表
    struct Output
    {
        // 气动力系数 速度系 [Cx, Cy, Cz]
        ASL::Vector Cxyz;

        // 气动力矩系数 机体系 [Mx, My, Mz]
        ASL::Vector Mxyz;

        // 气动力 N 机体系 [X, Y, Z]
        ASL::Vector force;

        // 气动力矩 N*m 机体系 [X, Y, Z]
        ASL::Vector torque;
    };

    // 参数端口列表
    struct Parameter
    {
        // 参考长度 m
        double L;

        // 参考面积 m^2
        double S;

        // 参考重心位置 m 结构系 [X, Y, Z]
        ASL::Vector CR;
    };

    // 设计数据列表
    struct Data
    {
        // 马赫数序列 -
        double vMach[5];

        // 阻力系数序列 -
        double vCxMach[5];

        // 升力系数序列 -
        double vCyMach[5];
        double vCyAlpha[5];

        // 侧向力系数序列
        double vCzBeta[5];

        // 滚动力矩系数列表
        double vMxBeta[5];
        double vMxDeltaX[5];

        // 航向力矩系数序列
        double vMyBeta[5];
        double vMyDeltaY[5];

        // 俯仰力矩系数序列
        double vMzAlpha[5];
        double vMzDeltaZ[5];
    };

public:
    // 输入端口对象
    UAVAeroDynamic::Input input;

    // 输入端口对象
    UAVAeroDynamic::Output output;

    // 参数端口对象
    UAVAeroDynamic::Parameter parameter;

    // 设计数据对象
    UAVAeroDynamic::Data data;

private:
    // 坐标系投影矩阵 速度系>机体系
    ASL::Matrix cV2B;

    // 综合气动系数数组
    ASL::Vector vCxyz;
    ASL::Vector vMxyz;

    // 气动系数线性插值表对象
    ASL::LookupTable vCxMach;
    ASL::LookupTable vCyMach;
    ASL::LookupTable vCyAlpha;
    ASL::LookupTable vCzBeta;
    ASL::LookupTable vMxBeta;
    ASL::LookupTable vMxDeltaX;
    ASL::LookupTable vMyBeta;
    ASL::LookupTable vMyDeltaY;
    ASL::LookupTable vMzAlpha;
    ASL::LookupTable vMzDeltaZ;
};

// 虚构固体火箭发动机模型
class UAVPropulsor
{
public:
    // 构造函数
    UAVPropulsor();

    // 析构函数
    ~UAVPropulsor();

    // 初始化函数
    void initialize(void);

    // 单步运行函数
    void step(void);

public:
    // 输入端口列表
    struct Input
    {
        // 仿真时间 s
        double time;

        // 飞行器重心位置 m 结构系 [X, Y, Z]
        ASL::Vector CG;
    };

    // 输出端口列表
    struct Output
    {
        // 额定推力 N
        double thrust;

        // 燃料消耗量 kg
        double fuelUsed;

        // 推力 N 机体系 [X, Y, Z]
        ASL::Vector force;

        // 推力矩 N*m 机体系 [X, Y, Z]
        ASL::Vector torque;
    };

    // 参数端口列表
    struct Parameter
    {
        // 安装位置 m 结构系 [X, Y, Z]
        ASL::Vector location;
    };

    // 设计数据列表
    struct Data
    {
        // 工作时间序列 s
        double vTime[10];

        // 额定推力序列 N
        double vThrust[10];
    };

public:
    // 输入端口对象
    UAVPropulsor::Input input;

    // 输入端口对象
    UAVPropulsor::Output output;

    // 参数端口对象
    UAVPropulsor::Parameter parameter;

    // 设计数据对象
    UAVPropulsor::Data data;

private:
    // 发动机点火时刻 s
    double vStartTime;

    // 动力性能线性插值表对象
    ASL::LookupTable vThrust;
};

// 虚构目标模型
class UAVTarget
{
public:
    // 构造函数
    UAVTarget();

    // 析构函数
    ~UAVTarget();

    // 初始化函数
    void initialize(void);

    // 单步运行函数
    void step(void);

public:
    // 输入端口列表
    struct Input
    {
        // 仿真时间 s
        double time;
    };

    // 输出端口列表
    struct Output
    {
        // 地理位置 [经度 deg, 纬度 deg, 海拔高度 m]
        ASL::Vector LLA;

        // 运动速度 m/s 导航系 [北, 天, 东]
        ASL::Vector vNav;
    };

    // 参数端口列表
    struct Parameter
    {
        // 初始地理位置 [经度 deg, 纬度 deg, 海拔高度 m]
        ASL::Vector LLA;

        // 初始运动速度 m/s 导航系 [北, 天, 东]
        ASL::Vector vNav;
    };

public:
    // 输入端口对象
    UAVTarget::Input input;

    // 输入端口对象
    UAVTarget::Output output;

    // 参数端口对象
    UAVTarget::Parameter parameter;

private:
    // 目标开始移动时刻 s
    double vStartTime;
};

// 虚构导引关系模型
class UAVGuidance
{
public:
    // 构造函数
    UAVGuidance();

    // 析构函数
    ~UAVGuidance();

    // 初始化函数
    void initialize(void);

    // 单步运行函数
    void step(void);

public:
    // 输入端口列表
    struct Input
    {
        // 飞行器地理位置 [经度 deg, 纬度 deg, 海拔高度 m]
        ASL::Vector aircraftLLA;

        // 飞行器速度 m/s 导航系 [北, 天, 东]
        ASL::Vector aircraftVelocity;

        // 目标地理位置 [经度 deg, 纬度 deg, 海拔高度 m]
        ASL::Vector targetLLA;

        // 目标速度 m/s 导航系 [北, 天, 东]
        ASL::Vector targetVelocity;
    };

    // 输出端口列表
    struct Output
    {
        // 相对距离 m
        double relativeDistance;

        // 接近速度 m/s
        double ApproachingSpeed;

        // 视线角 deg [0, 方位角, 高低角]
        ASL::Vector LOSAngle;

        // 视线角速度 deg/s [0, 方位角速度, 高低角速度]
        ASL::Vector LOSRate;
    };

    // 参数端口列表
    struct Parameter
    {
    };

public:
    // 输入端口对象
    UAVGuidance::Input input;

    // 输入端口对象
    UAVGuidance::Output output;

    // 参数端口对象
    UAVGuidance::Parameter parameter;

private:
    // 坐标系投影矩阵 导航系>视线系
    ASL::Matrix cN2L;
};

// 虚拟飞行控制系统模型
class UAVControlSystem
{
public:
    // 构造函数
    UAVControlSystem();

    // 析构函数
    ~UAVControlSystem();

    // 初始化函数
    void initialize(double stepSize);

    // 单步运行函数
    void step(void);

public:
    // 飞行任务模式
    enum Mode
    {
        // 起飞模式
        Launch = 1,

        // 巡航模式
        Cruise,

        // 攻击模式
        Attack,
    };

    // 输入端口列表
    struct Input
    {
        // 仿真时间 s
        double time;

        // 飞行器地理位置 [经度 deg, 纬度 deg, 海拔高度 m]
        ASL::Vector LLA;

        // 飞行速度 m/s 导航系 [X, Y, Z]
        ASL::Vector vNav;

        // 机体加速度 m/s^2 机体系 [X, Y, Z]
        ASL::Vector aBody;

        // 姿态角 deg [滚动角, 航向角, 俯仰角]
        ASL::Vector eular;

        // 姿态角速度 deg/s 机体系 [X, Y, Z]
        ASL::Vector omega;

        // 视线角速度 deg/s [0, 方位角速度, 高低角速度]
        ASL::Vector LOSRate;
    };

    // 输出端口列表
    struct Output
    {
        // 舵面控制指令 deg [副翼, 方向舵, 升降舵]
        ASL::Vector delta;

        // 姿态角指令 deg
        ASL::Vector eularCommand;

        // 机体加速度指令 m/s^2
        ASL::Vector accelerationCommand;

        // 海拔高度指令 m
        double altitudeCommand;
    };

    // 参数端口列表
    struct Parameter
    {
        // 预设目标位置 [经度 deg, 纬度 deg, 海拔高度 m]
        ASL::Vector targetLocation;

        // 预设巡航高度 m
        double cruiseAltitude;

        // 预设发射姿态 deg
        ASL::Vector launchEular;
    };

public:
    // 输入端口对象
    UAVControlSystem::Input input;

    // 输入端口对象
    UAVControlSystem::Output output;

    // 参数端口对象
    UAVControlSystem::Parameter parameter;

private:
    // 发射模式控制算法
    void launch(void);

    // 巡航模式控制算法
    void cruise(void);

    // 攻击模式控制算法
    void attack(void);

    // 飞行任务模式
    int vMode;

    // 飞行器与预设目标位置距离 m
    double distance;

    // 飞行器与预设目标位置方位角 deg
    double angle;

    // 控制时间指针 s
    double vLaunchTime;
    double vCruiseTime;
    double vAttackTime;

    // 控制时刻姿态角 deg
    ASL::Vector vLaunchEular;
    ASL::Vector vCruiseEular;
    ASL::Vector vAttackEular;

    // 控制时刻位置 -
    ASL::Vector vLaunchLLA;
    ASL::Vector vCruiseLLA;
    ASL::Vector vAttackLLA;

    // 控制时刻加速度 m/s^2
    ASL::Vector vAttackAcceleration;

    // 积分计算器
    ASL::Calculus cDeltaHeight;

    // 坐标系投影矩阵 导航系>弹道系
    ASL::Matrix cN2T;

    // 坐标系投影矩阵 导航系>机体系
    ASL::Matrix cN2B;
};

// 自定义执行机构模型
class UAVActuator
{
public:
    // 构造函数
    UAVActuator();

    // 析构函数
    ~UAVActuator();

    // 初始化函数
    // 输入 stepSize 仿真步长 s
    // 返回 return 是否正常执行 true/false
    bool initialize(double stepSize);

    // 单步运行函数
    // 输入 -
    // 返回 return 是否正常执行 true/false
    bool step(void);

public:
    // 输入端口列表
    struct Input
    {
        // 伺服控制信号 -
        double u;
    };

    // 输出端口列表
    struct Output
    {
        // 伺服偏转信号 -
        double y;
    };

    // 参数端口列表
    struct Parameter
    {
        // 初始伺服位置 -
        double initialValue;

        // 比例系数 -
        double k;

        // 伺服位置限制 - [min, max]
        double locationRange[2];

        // 伺服速率限制 -/s [min, max]
        double velocityRange[2];
    };

public:
    // 输入端口对象
    UAVActuator::Input input;

    // 输入端口对象
    UAVActuator::Output output;

    // 参数端口对象
    UAVActuator::Parameter parameter;

private:
    // 积分器
    ASL::Calculus cIntegrator;
};

// 自定义飞行仿真工程
class UAVSimulation
{
public:
    // 构造函数
    UAVSimulation();

    // 析构函数
    ~UAVSimulation();

    // 准备函数
    void setup(void);

    // 初始化函数
    void initialize(void);

    // 单步运行函数
    void step(void);

private:
    // 仿真开始时间 s
    double startTime;

    // 仿真停止时间 s
    double stopTime;

    // 仿真计算步长 s
    double stepSize;

    // 当前仿真时间 s
    double currentTime;

    // 当前仿真周期计数
    int currentCount;

    // 飞行器数学模型
    UAVMass cMassModel;
    UAVAeroDynamic cAeroModel;
    UAVPropulsor cThrustModel;
    UAVControlSystem cControlModel;
    UAVActuator cActutorModelX;
    UAVActuator cActutorModelY;
    UAVActuator cActutorModelZ;

    // 目标模型
    UAVTarget cTargetModel;
    UAVGuidance cGuidanceModel;

    // 大气环境模型
    ASL::ISA cAtmosModel;

    // 六自由度运动学模型
    ASL::DOF6ECEF cDOFModel;

    // 数据记录文件流
    std::ofstream cStream;
};